"""
高精度医疗评估提示词 - 专为DeepSeek-R1等推理模型优化
使用思维链(Chain of Thought)和Few-shot learning提升评估精度
"""

# 系统角色定义 - 强化专业性
SYSTEM_ROLE = """你是一位拥有20年以上临床经验的医疗质量管理专家，你：
- 精通《医疗机构病历管理规定》和《病历书写基本规范》
- 熟悉临床医学各科室的诊疗规范和用药指南
- 擅长识别病历中的细微问题、逻辑矛盾和潜在医疗风险
- 评估标准严格、客观、专业

你的评估方式：
1. 仔细阅读病历的每一个细节
2. 逐项对照规范标准进行检查
3. 发现问题时必须给出具体的改进建议
4. 评分公正，既不过分苛刻也不过分宽容"""


# 增强版评估提示词（包含思维链引导）
ENHANCED_EVALUATION_TEMPLATE = """# 医疗病历质量评估任务

## 📋 待评估病历信息

### 基本信息
- 患者姓名：{patient_name}
- 性别：{patient_gender}
- 年龄：{patient_age}岁
- 科室：{department}
- 就诊日期：{visit_date}

### 临床信息
**主诉：** {chief_complaint}

**现病史：** {present_illness}

**既往史：** {past_history}

**过敏史：** {allergy_history}

**体格检查：** {physical_exam}

**辅助检查：** {auxiliary_exam}

**诊断：** {diagnosis}

**治疗方案：**
{medications}

---

## 📊 评估标准与要求

### 第一步：完整性评估（满分30分）

**必须检查的项目：**
1. ✅ 基本信息完整性：姓名、性别、年龄、科室、日期
2. ✅ 主诉完整性：症状+持续时间（如"发热3天"）
3. ✅ 现病史完整性：发病过程、症状变化、就诊经过
4. ✅ 既往史、过敏史是否明确记录
5. ✅ 体格检查是否包含生命体征（T、P、R、BP）
6. ✅ 诊断是否明确（不能为空）
7. ✅ 治疗方案是否记录

**扣分规则：**
- 缺少关键信息（如主诉、诊断、现病史）→ 扣8-12分
- 缺少重要信息（如年龄、性别、科室）→ 扣3-5分
- 信息不完整但有记录 → 扣1-3分

**请先分析：**
- 哪些必填项缺失了？
- 哪些项目填写不完整？
- 初步完整性得分应该是多少？

---

### 第二步：规范性评估（满分25分）

**检查要点：**
1. **主诉规范性**
   - 是否简洁明了（≤50字）
   - 是否包含症状+时间
   
2. **现病史详细度**
   - 是否≥20字
   - 是否描述了发病过程
   
3. **体格检查格式**
   - 生命体征是否完整（T、P、R、BP）
   - 数值是否带单位（℃、次/分、mmHg）
   
4. **诊断格式**
   - 是否使用规范医学术语
   - 疑问诊断是否使用"疑诊"而非"?"
   
5. **过敏史书写**
   - 是否明确说明"否认药物过敏史"或"有XX过敏史"

**扣分规则：**
- 格式严重不规范 → 扣5-10分
- 术语使用不当 → 扣3-5分
- 格式瑕疵 → 扣1-3分

**请先分析：**
- 主诉、现病史、体格检查是否符合规范？
- 有哪些格式问题需要纠正？
- 初步规范性得分应该是多少？

---

### 第三步：一致性评估（满分25分）

**关键检查项：**
1. **诊断与症状的匹配度**
   - 诊断为"高血压"，症状中应有头痛/头晕/血压高
   - 诊断为"胃炎"，症状中应有胃痛/腹痛/恶心/呕吐
   - 诊断为"痛风"，症状中应有关节肿痛/红肿
   - 诊断为"糖尿病"，症状中应有多饮/多尿/多食/消瘦
   - 诊断为"外伤/挫伤/骨折"，应有外伤史、疼痛、肿胀等症状
   
2. **用药与诊断的严格匹配度**（⚠️ 重点评估）
   - **痛风**：秋水仙碱、别嘌醇、非布司他、碳酸氢钠、非甾体抗炎药
   - **高血压**：普利类（卡托普利）、沙坦类（缬沙坦）、地平类（硝苯地平）、利尿剂
   - **感染/炎症**：抗生素（头孢、青霉素、喹诺酮）必须有感染指征
   - **骨折/外伤**：通常无特效药，主要靠固定、换药、止痛（布洛芬、对乙酰氨基酚）
   - **检查项目**：CT、X光、核磁共振等应列在"辅助检查"或"嘱托"，不应列为"用药"
   
3. **用药规格、剂量、频次合理性**（🔍 新增）
   - **规格**：如"100mg"、"0.5g"，应符合该药物的常见规格
   - **频次**：q.d.（每日1次）、b.i.d.（每日2次）、t.i.d.（每日3次）、q.i.d.（每日4次）
   - **用药天数**：门诊≤14天（特殊慢性病可≤30天），超出需说明理由
   - **用法**：口服(p.o.)、静脉(i.v.)、肌注(i.m.)、外用等应明确
   
4. **特殊情况检查**（🚨 高风险）
   - **药物配伍禁忌**：如华法林+阿司匹林易出血，需说明
   - **过敏史冲突**：过敏史中有"青霉素过敏"，不能使用青霉素类
   - **儿童/老年人用药**：儿童剂量应按体重计算，老年人需减量（如肾功能不全）
   - **妊娠期用药**：孕妇禁用某些药物（如利巴韦林、米非司酮）
   
5. **年龄/性别与诊断的合理性**
   - 男性不应有妇产科疾病
   - 儿童用药剂量应符合年龄和体重
   - 老年患者（≥65岁）应关注多重用药、肝肾功能

**扣分规则：**
- 严重逻辑矛盾（如诊断与症状完全不符）→ 扣10-15分
- 明显不一致（如用药与诊断不匹配、用药与过敏史冲突）→ 扣5-10分
- 检查项目误列为"用药"（如CT、X光在用药信息中）→ 扣3-5分（规范性问题）
- 用药剂量/频次异常 → 扣3-5分
- 轻微不一致 → 扣1-3分

**⚠️ 针对你的病历特点，特别注意：**
- 如果"用药信息"中包含"CT扫描"、"X光检查"、"换药"等，这些应归类为"辅助检查"或"处置"，而非"药物"
- 外伤/骨折病历：主要治疗是固定、换药、物理治疗，药物仅辅助止痛，不应期待大量药物
- 门诊病历：用药天数通常≤7天（急性病）或≤14天（慢性病复诊）

**请先分析：**
- 诊断与症状描述是否吻合？
- 用药方案是否合理？
- 是否存在逻辑矛盾？
- 初步一致性得分应该是多少？

---

### 第四步：准确性评估（满分20分）

**数值合理性检查：**
1. **年龄范围：** 0-105岁（超出→扣15分）
2. **体温范围：** 35.0-42.0℃（超出→扣10分）
3. **脉搏范围：** 40-200次/分（超出→扣8分）
4. **血压范围：** 收缩压60-250mmHg，舒张压40-150mmHg（超出→扣8分）
5. **用药天数：** 门诊≤30天（超出→扣5分）

**请先分析：**
- 各项数值是否在合理范围内？
- 是否存在明显的数据错误？
- 初步准确性得分应该是多少？

---

## 🎯 输出格式要求

**请严格按照以下JSON格式输出（不要包含markdown代码块标记，直接输出JSON）：**

{{
  "thinking_process": "你的分析思路：简要说明你发现了哪些问题，为什么这样评分（100字内）",
  "completeness_score": 整数0-30,
  "standardization_score": 整数0-25,
  "consistency_score": 整数0-25,
  "accuracy_score": 整数0-20,
  "overall_score": 整数0-100（四个维度分数之和）,
  "issues": [
    {{
      "issue_type": "completeness/standardization/consistency/accuracy",
      "severity": "critical/major/minor/info",
      "field_name": "问题字段名称",
      "issue_description": "具体问题描述（专业、准确、清晰）",
      "suggestion": "可操作的改进建议",
      "score_deduction": 扣分值
    }}
  ],
  "summary": "整体评估总结（突出最严重的问题和主要优点，100字内）",
  "suggestions": [
    "建议1：具体、专业、可落地",
    "建议2：...",
    "建议3：..."
  ],
  "risk_level": "low/medium/high/critical",
  "strengths": ["优点1", "优点2"],
  "weaknesses": ["不足1", "不足2"]
}}

---

## 💡 评估示例参考

### 示例1：高质量病历（90-100分）
```json
{{
  "chief_complaint": "反复胸闷、气短2年，加重1周。",
  "present_illness": "患者2年前无明显诱因出现胸闷、气短，活动后加重，休息后缓解。1周前症状加重，夜间平卧时明显，需取半卧位。伴双下肢水肿。",
  "physical_exam": "T 36.5℃，P 78次/分，R 18次/分，BP 130/80mmHg",
  "diagnosis": ["冠心病", "心功能不全"],
  "medications": [
    {{"名称": "阿司匹林", "剂量": "100mg", "频次": "每日1次"}},
    {{"名称": "呋塞米", "剂量": "20mg", "频次": "每日1次"}}
  ]
}}
```
✅ **评估：** 完整性30分，规范性25分，一致性25分，准确性20分，总分100分
✅ **理由：** 信息完整、格式规范、诊断与症状一致、用药合理

### 示例2：存在问题的病历（60-70分）
```json
{{
  "chief_complaint": "头痛",  // ❌ 缺少时间
  "present_illness": "头痛",  // ❌ 太简单，<20字
  "physical_exam": "体温正常，血压偏高",  // ❌ 缺少具体数值
  "diagnosis": ["痛风"],  // ❌ 诊断与症状不符
  "medications": []  // ❌ 无用药记录
}}
```
⚠️ **评估：** 完整性15分，规范性10分，一致性10分，准确性18分，总分53分
⚠️ **问题：** 主诉不规范、现病史过简、诊断与症状矛盾、缺少用药

---

## 🚨 重要提醒

1. **客观评估**：基于事实和标准，不受主观情绪影响
2. **具体问题**：指出问题时要说明具体位置和原因
3. **实用建议**：改进建议要具体、专业、可操作
4. **合理扣分**：扣分要有依据，不过分苛刻也不过分宽松
5. **风险识别**：优先关注影响患者安全的问题

---

现在，请开始评估上述病历。

**第一步：** 先在thinking_process中简要说明你的分析思路
**第二步：** 按照评估标准逐项检查
**第三步：** 输出完整的JSON格式评估结果

请开始评估👇
"""


# Few-shot示例（帮助模型理解评估标准）
FEW_SHOT_EXAMPLES = """
以下是2个评估示例，帮助你理解标准：

**示例A：优秀病历**
输入：
- 主诉：反复胸闷、气短2年，加重1周。
- 现病史：患者2年前无明显诱因出现胸闷、气短，活动后加重...（详细）
- 体格检查：T 36.5℃，P 78次/分，R 18次/分，BP 130/80mmHg
- 诊断：冠心病
- 用药：阿司匹林、硝酸甘油

输出：
{
  "completeness_score": 30,
  "standardization_score": 25,
  "consistency_score": 25,
  "accuracy_score": 20,
  "overall_score": 100,
  "issues": [],
  "summary": "病历质量优秀，信息完整，格式规范，诊疗方案合理。"
}

**示例B：存在问题的病历**
输入：
- 主诉：头痛（❌缺时间）
- 现病史：头痛（❌太简单）
- 体格检查：正常（❌缺具体数值）
- 诊断：痛风（❌与症状不符）
- 用药：空

输出：
{
  "completeness_score": 15,
  "standardization_score": 10,
  "consistency_score": 10,
  "accuracy_score": 18,
  "overall_score": 53,
  "issues": [
    {
      "issue_type": "completeness",
      "severity": "major",
      "field_name": "主诉",
      "issue_description": "主诉缺少症状持续时间",
      "suggestion": "应完善为'头痛X天'的格式",
      "score_deduction": 5
    },
    {
      "issue_type": "standardization",
      "severity": "major",
      "field_name": "现病史",
      "issue_description": "现病史过于简单（<20字），未描述发病过程",
      "suggestion": "应详细记录发病时间、症状特点、伴随症状、就诊经过",
      "score_deduction": 10
    },
    {
      "issue_type": "consistency",
      "severity": "critical",
      "field_name": "诊断",
      "issue_description": "诊断为痛风，但症状描述中无关节肿痛等典型痛风症状",
      "suggestion": "请核实诊断是否正确，或补充症状描述",
      "score_deduction": 15
    }
  ],
  "summary": "病历质量不达标（53分）。主要问题：诊断与症状严重不符，现病史过于简单，主诉不规范。"
}
"""


def build_enhanced_prompt(record_data: dict) -> str:
    """
    构建增强版评估提示词
    
    Args:
        record_data: 病历数据字典
        
    Returns:
        完整的提示词
    """
    # 提取并格式化用药信息
    raw_data = record_data.get('raw_data', {})
    medications = raw_data.get('用药信息', [])
    
    if medications:
        med_text = []
        for i, med in enumerate(medications, 1):
            parts = [f"{i}. {med.get('名称', '未知药物')}"]
            if med.get('规格'):
                parts.append(f"规格：{med['规格']}")
            if med.get('用法'):
                parts.append(f"用法：{med['用法']}")
            if med.get('频次'):
                parts.append(f"频次：{med['频次']}")
            if med.get('天数'):
                parts.append(f"疗程：{med['天数']}")
            med_text.append('，'.join(parts))
        medications_str = '\n'.join(med_text)
    else:
        medications_str = "无用药记录"
    
    # 格式化诊断
    diagnosis = record_data.get('diagnosis', [])
    if diagnosis:
        diagnosis_str = '、'.join(diagnosis)
    else:
        diagnosis_str = "未明确诊断"
    
    # 构建完整提示词
    prompt = ENHANCED_EVALUATION_TEMPLATE.format(
        patient_name=record_data.get('patient_name', '未知'),
        patient_gender=record_data.get('patient_gender', '未知'),
        patient_age=record_data.get('patient_age', '未知'),
        department=record_data.get('department', '未知'),
        visit_date=record_data.get('visit_date', '未记录'),
        chief_complaint=record_data.get('chief_complaint', '无'),
        present_illness=record_data.get('present_illness', '无'),
        past_history=record_data.get('past_history', '无'),
        allergy_history=record_data.get('allergy_history', '无'),
        physical_exam=record_data.get('physical_exam', '无'),
        auxiliary_exam=record_data.get('auxiliary_exam', '无'),
        diagnosis=diagnosis_str,
        medications=medications_str
    )
    
    return prompt

